<?php

class ADODB_pdo_mysql extends ADODB_pdo {

    var $metaTablesSQL = "SHOW TABLES";
    var $metaColumnsSQL = "SHOW COLUMNS FROM `%s`";
    var $sysDate = 'CURDATE()';
    var $sysTimeStamp = 'NOW()';
    var $hasGenID = true;
    var $_genIDSQL = "update %s set id=LAST_INSERT_ID(id+1);";
    var $_dropSeqSQL = "drop table %s";
    var $fmtTimeStamp = "'Y-m-d, H:i:s'";
    var $nameQuote = '`';

    function _init($parentDriver) {

        $parentDriver->hasTransactions = false;
        $parentDriver->hasInsertID = true;
        $parentDriver->_connectionID->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
    }

    function OffsetDate($dayFraction, $date = false) {
        if (!$date)
            $date = $this->sysDate;

        $fraction = $dayFraction * 24 * 3600;
        return $date . ' + INTERVAL ' . $fraction . ' SECOND';
    }

    function Concat() {
        $s = "";
        $arr = func_get_args();
        $s = implode(',', $arr);
        if (strlen($s) > 0)
            return "CONCAT($s)";
        return '';
    }

    function ServerInfo() {
        $arr['description'] = ADOConnection::GetOne("select version()");
        $arr['version'] = ADOConnection::_findvers($arr['description']);
        return $arr;
    }

    function MetaTables($ttype = false, $showSchema = false, $mask = false) {
        $save = $this->metaTablesSQL;
        if ($showSchema && is_string($showSchema)) {
            $this->metaTablesSQL .= " from $showSchema";
        }

        if ($mask) {
            $mask = $this->qstr($mask);
            $this->metaTablesSQL .= " like $mask";
        }
        $ret = ADOConnection::MetaTables($ttype, $showSchema);

        $this->metaTablesSQL = $save;
        return $ret;
    }

    function SetTransactionMode($transaction_mode) {
        $this->_transmode = $transaction_mode;
        if (empty($transaction_mode)) {
            $this->Execute('SET TRANSACTION ISOLATION LEVEL REPEATABLE READ');
            return;
        }
        if (!stristr($transaction_mode, 'isolation'))
            $transaction_mode = 'ISOLATION LEVEL ' . $transaction_mode;
        $this->Execute("SET SESSION TRANSACTION " . $transaction_mode);
    }

    function MetaColumns($table, $normalize = true) {
        $this->_findschema($table, $schema);
        if ($schema) {
            $dbName = $this->database;
            $this->SelectDB($schema);
        }
        global $ADODB_FETCH_MODE;
        $save = $ADODB_FETCH_MODE;
        $ADODB_FETCH_MODE = ADODB_FETCH_NUM;

        if ($this->fetchMode !== false)
            $savem = $this->SetFetchMode(false);
        $rs = $this->Execute(sprintf($this->metaColumnsSQL, $table));

        if ($schema) {
            $this->SelectDB($dbName);
        }

        if (isset($savem))
            $this->SetFetchMode($savem);
        $ADODB_FETCH_MODE = $save;
        if (!is_object($rs)) {
            $false = false;
            return $false;
        }

        $retarr = array();
        while (!$rs->EOF) {
            $fld = new ADOFieldObject();
            $fld->name = $rs->fields[0];
            $type = $rs->fields[1];

            // split type into type(length):
            $fld->scale = null;
            if (preg_match("/^(.+)\((\d+),(\d+)/", $type, $query_array)) {
                $fld->type = $query_array[1];
                $fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
                $fld->scale = is_numeric($query_array[3]) ? $query_array[3] : -1;
            } elseif (preg_match("/^(.+)\((\d+)/", $type, $query_array)) {
                $fld->type = $query_array[1];
                $fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
            } elseif (preg_match("/^(enum)\((.*)\)$/i", $type, $query_array)) {
                $fld->type = $query_array[1];
                $arr = explode(",", $query_array[2]);
                $fld->enums = $arr;
                $zlen = max(array_map("strlen", $arr)) - 2; // PHP >= 4.0.6
                $fld->max_length = ($zlen > 0) ? $zlen : 1;
            } else {
                $fld->type = $type;
                $fld->max_length = -1;
            }
            $fld->not_null = ($rs->fields[2] != 'YES');
            $fld->primary_key = ($rs->fields[3] == 'PRI');
            $fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false);
            $fld->binary = (strpos($type, 'blob') !== false);
            $fld->unsigned = (strpos($type, 'unsigned') !== false);

            if (!$fld->binary) {
                $d = $rs->fields[4];
                if ($d != '' && $d != 'NULL') {
                    $fld->has_default = true;
                    $fld->default_value = $d;
                } else {
                    $fld->has_default = false;
                }
            }

            if ($save == ADODB_FETCH_NUM) {
                $retarr[] = $fld;
            } else {
                $retarr[strtoupper($fld->name)] = $fld;
            }
            $rs->MoveNext();
        }

        $rs->Close();
        return $retarr;
    }

    function SelectLimit($sql, $nrows = -1, $offset = -1, $inputarr = false, $secs = 0) {
        $offsetStr = ($offset >= 0) ? "$offset," : '';
        if ($nrows < 0)
            $nrows = '18446744073709551615';

        if ($secs)
            $rs = $this->CacheExecute($secs, $sql . " LIMIT $offsetStr$nrows", $inputarr);
        else
            $rs = $this->Execute($sql . " LIMIT $offsetStr$nrows", $inputarr);
        return $rs;
    }

}

?>